home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Aminet 1 (Walnut Creek)
/
Aminet - June 1993 [Walnut Creek].iso
/
aminet
/
misc
/
amag
/
9301b.lha
/
Devices (Folge 3)
/
Terminal.mod
< prev
next >
Wrap
Text File
|
1992-04-18
|
10KB
|
410 lines
MODULE Terminal;
FROM Arts IMPORT
BreakPoint, returnVal, kickVersion;
FROM DosD IMPORT
diskInfo, FileHandlePtr, InfoData, newFile,
oldFile, StandardPacket;
FROM DosL IMPORT
Close, FPuts, FRead, FWrite, IsInteractive, Open,
Read, Write;
FROM ExecD IMPORT
execBase, MemReqs, MemReqSet, Message, message,
MsgPortPtr, openFail, read, write;
FROM ExecL IMPORT
AllocMem, CloseDevice, CreateMsgPort, DeleteMsgPort,
DoIO, FindName, Forbid, FreeMem, GetMsg, OpenDevice,
Permit, PutMsg, RemDevice, ReplyMsg,
SendIO, Wait, WaitIO, WaitPort;
FROM ExecSupport IMPORT
AbortIO, BeginIO;
FROM IntuitionD IMPORT
IDCMPFlags, IDCMPFlagSet, IntuiMessagePtr, WindowPtr;
FROM IntuitionL IMPORT
ModifyIDCMP;
FROM Serial IMPORT
Error, IOExtSer, IOExtSerPtr, query, serialName,
SerFlags, setParams;
FROM SYSTEM IMPORT
ADDRESS, ADR, BPTR, CAST, LONGSET, TSIZE;
CONST
TxTitle = "CON:0/0/500/100/ Terminal-Send ";
RxTitle = "CON:0/101/500/100/ Terminal-Receive ";
Senden = "\nSende Textdatei\n\n";
Empfang = "\nwarte auf Textdatei\n\n";
Beendet = "\nÜbertragung beendet\n\n";
Unit0 = 0; (* festeingebaute serielle Schnittstelle *)
(*
Doppelt ausgelegte Datenstrukturen
Sendeteil: Empfangsteil:
*)
VAR
txRequest, rxRequest : IOExtSer;
txWin, rxWin : FileHandlePtr;
txWinPtr, rxWinPtr : WindowPtr;
rxPuffer, txPuffer : ARRAY[0..511] OF CHAR;
PROCEDURE GetWinPointer (winHdl : FileHandlePtr;
VAR winPtr : WindowPtr);
TYPE GetBlock = RECORD
stdPkt : StandardPacket;
info : InfoData;
END;
GetBlockPtr = POINTER TO GetBlock;
VAR
portPtr : MsgPortPtr;
pktPtr : GetBlockPtr;
BEGIN
winPtr := NIL;
IF IsInteractive(winHdl) THEN
portPtr := CreateMsgPort();
IF portPtr # NIL THEN
pktPtr := AllocMem(TSIZE(GetBlock), MemReqSet{memClear, public});
IF pktPtr # NIL THEN
WITH pktPtr^.stdPkt DO
WITH pkt DO
link := ADR(msg);
port := ADDRESS(portPtr);
type := diskInfo;
arg1 := CAST(LONGINT, BPTR(ADR(pktPtr^.info)));
END;
WITH msg DO
node.name := ADR(pktPtr^.stdPkt.pkt);
node.type := message;
length := SIZE(pktPtr^);
END;
END;
PutMsg(winHdl^.type, pktPtr);
REPEAT
WaitPort(portPtr);
UNTIL GetMsg(portPtr) = pktPtr;
DeleteMsgPort(portPtr);
WITH pktPtr^ DO
IF (stdPkt.pkt.res1 # 0) AND (info.volumeNode # NIL) THEN
winPtr := CAST(ADDRESS, info.volumeNode);
END;
END;
FreeMem(pktPtr, TSIZE(GetBlock));
ELSE
DeleteMsgPort(portPtr);
END;
END;
END;
END GetWinPointer;
PROCEDURE MakeWindow(namePtr : ADDRESS;
VAR winPtr : WindowPtr;
VAR fileHdl : FileHandlePtr);
BEGIN
fileHdl := Open(namePtr, newFile);
IF fileHdl # NIL THEN
GetWinPointer(fileHdl, winPtr);
END;
END MakeWindow;
PROCEDURE WindowsAngelegt() : BOOLEAN;
VAR angelegt :BOOLEAN;
BEGIN
angelegt := FALSE;
MakeWindow(ADR(TxTitle), txWinPtr, txWin);
IF txWinPtr # NIL THEN
angelegt := TRUE;
ModifyIDCMP(txWinPtr, IDCMPFlagSet{rawKey, vanillaKey});
MakeWindow(ADR(RxTitle), rxWinPtr, rxWin);
IF rxWinPtr = NIL THEN
angelegt := FALSE; (* für rxWin Keys ausfiltern *)
Close(txWin);
txWin := NIL;
END;
ELSIF txWin # NIL THEN
Close(txWin);
END;
RETURN angelegt;
END WindowsAngelegt;
PROCEDURE SetBaudRate(VAR serPtr : IOExtSerPtr);
BEGIN
WITH serPtr^ DO
baud := 9600;
ioSer.command := setParams;
END;
DoIO(serPtr);
END SetBaudRate;
PROCEDURE InitSerialDev(serPtr : IOExtSerPtr;
cmnd : INTEGER) : BOOLEAN;
VAR portPtr : MsgPortPtr;
erfolg : BOOLEAN;
BEGIN
erfolg := FALSE;
portPtr := CreateMsgPort();
IF portPtr # NIL THEN
WITH serPtr^ DO
INCL(serFlags, shared);
WITH ioSer DO
length := 1;
message.replyPort := portPtr;
END;
END;
OpenDevice(ADR(serialName), Unit0, serPtr, LONGSET{});
IF serPtr^.ioSer.error # openFail THEN
erfolg := TRUE;
SetBaudRate(serPtr);
serPtr^.ioSer.command := cmnd;
ELSE
WITH serPtr^.ioSer.message DO
DeleteMsgPort(replyPort);
replyPort := NIL;
END;
END;
END;
RETURN (erfolg);
END InitSerialDev;
PROCEDURE SerialVorbereitet() : BOOLEAN;
VAR vorbereitet : BOOLEAN;
BEGIN
IF InitSerialDev(ADR(txRequest), write) THEN
vorbereitet := TRUE;
txRequest.ioSer.data := ADR(txPuffer);
IF InitSerialDev(ADR(rxRequest), read) THEN
rxRequest.ioSer.data := ADR(rxPuffer);
ELSE
vorbereitet := FALSE;
WITH txRequest.ioSer.message DO
DeleteMsgPort(replyPort);
replyPort := NIL;
END;
END;
ELSE
vorbereitet := FALSE;
END;
RETURN vorbereitet;
END SerialVorbereitet;
PROCEDURE SetTermChars(serPtr : IOExtSerPtr);
BEGIN
WITH serPtr^ DO
ioSer.command := setParams;
INCL(serFlags, eofMode);
WITH termArray DO
termArray0 := 1C040303H; (* EOF-EOT-ETX-ETX *)
termArray1 := 03030303H; (* RTX-... *)
END;
BreakPoint(NIL);
DoIO(serPtr);
END;
END SetTermChars;
PROCEDURE SendeTextDatei(txDateiRequest : IOExtSer);
VAR txDateiHdl : FileHandlePtr;
gelesen,
geschrieben : LONGINT;
BEGIN
geschrieben := FPuts(txWin, ADR(Senden));
SetTermChars(ADR(txDateiRequest));
txDateiRequest.ioSer.command := write;
txDateiHdl := Open(ADR("S:StartUp-Sequence"), oldFile);
IF txDateiHdl # NIL THEN
LOOP
WITH txDateiRequest.ioSer DO
gelesen := FRead(txDateiHdl, ADR(txPuffer), 1, SIZE(txPuffer));
IF gelesen # 0 THEN
length := gelesen;
DoIO(ADR(txDateiRequest));
geschrieben := Write(txWin, ADR("."), 1);
ELSE
EXIT;
END;
IF error # 0 THEN
EXIT;
END;
END;
END;
Close(txDateiHdl);
END;
geschrieben := FPuts(txWin, ADR(Beendet));
END SendeTextDatei;
PROCEDURE EmpfangeTextDatei(rxDateiRequest : IOExtSer);
VAR rxDatei : FileHandlePtr;
geschrieben : LONGINT;
queryRequest : IOExtSer;
BEGIN
geschrieben := FPuts(rxWin, ADR(Empfang));
SetTermChars(ADR(rxDateiRequest));
queryRequest := rxDateiRequest;
queryRequest.ioSer.command := query;
WITH rxDateiRequest DO
ioSer.command := read;
ioSer.length := 1;
END;
rxDatei := Open(ADR("RAM:Ser.tst"), newFile);
IF rxDatei # NIL THEN
LOOP
DoIO(ADR(rxDateiRequest));
IF rxDateiRequest.ioSer.actual # 0 THEN
geschrieben := FWrite(rxDatei, ADR(rxPuffer), 1, rxDateiRequest.ioSer.actual);
geschrieben := Write(rxWin, ADR("."), 1);
ELSE
EXIT;
END;
DoIO(ADR(queryRequest));
IF queryRequest.ioSer.actual = 0 THEN
EXIT;
ELSE
rxDateiRequest.ioSer.length := LONGINT(queryRequest.ioSer.actual);
END;
END; (* LOOP *)
Close(rxDatei);
END;
geschrieben := FPuts(rxWin, ADR(Beendet));
END EmpfangeTextDatei;
PROCEDURE TerminalLoop;
VAR inMsgPtr : IntuiMessagePtr;
klasse : IDCMPFlagSet;
done : LONGINT;
erwartSig,
erhaltSig : LONGSET;
raw : INTEGER;
BEGIN
erwartSig := LONGSET{txWinPtr^.userPort^.sigBit};
INCL(erwartSig, rxRequest.ioSer.message.replyPort^.sigBit);
SendIO(ADR(rxRequest));
LOOP
erhaltSig := Wait(erwartSig);
IF txWinPtr^.userPort^.sigBit IN erhaltSig THEN
inMsgPtr := GetMsg(txWinPtr^.userPort);
klasse := inMsgPtr^.class;
raw := inMsgPtr^.code;
ReplyMsg(inMsgPtr);
IF (vanillaKey IN klasse) THEN
txPuffer[0] := CHAR(raw);
IF (txPuffer[0] # 033C) THEN
done := Write(txWin, ADR(txPuffer[0]), 1);
DoIO(ADR(txRequest));
ELSE
EXIT;
END;
ELSIF (rawKey IN klasse) THEN
IF (raw >= 80) AND (raw <= 89) THEN (* F1 = 80 *)
(* Funktionstasten auswerten F1 - F10 *)
IF raw = 80 THEN
SendeTextDatei(txRequest);
ELSIF raw = 81 THEN
EmpfangeTextDatei(rxRequest);
END;
END;
END;
END;
IF rxRequest.ioSer.message.replyPort^.sigBit IN erhaltSig THEN
WaitIO(ADR(rxRequest));
IF rxRequest.ioSer.error = 0 THEN
done := Write(rxWin, ADR(rxPuffer[0]), 1);
END;
WITH rxRequest.ioSer DO
command := query;
DoIO(ADR(rxRequest));
command := read;
IF actual > 0 THEN
length := actual;
DoIO(ADR(rxRequest));
done := Write(rxWin, ADR(rxPuffer), actual);
length := 1;
END;
END;
SendIO(ADR(rxRequest));
END;
END;
AbortIO(ADR(rxRequest));
WaitIO(ADR(rxRequest));
END TerminalLoop;
PROCEDURE FlushSerialDevice;
VAR serDev : ADDRESS;
BEGIN
serDev := FindName(ADR(execBase^.deviceList), ADR(serialName));
IF serDev # NIL THEN
Forbid();
RemDevice(serDev);
Permit();
END;
END FlushSerialDevice;
PROCEDURE Aufraeumen;
BEGIN
DeleteMsgPort(rxRequest.ioSer.message.replyPort);
CloseDevice(ADR(rxRequest));
DeleteMsgPort(txRequest.ioSer.message.replyPort);
CloseDevice(ADR(txRequest));
Close(rxWin);
Close(txWin);
FlushSerialDevice;
END Aufraeumen;
BEGIN
IF kickVersion >= 36 THEN
IF WindowsAngelegt() AND SerialVorbereitet() THEN
TerminalLoop;
Aufraeumen;
ELSE
returnVal := -11;
END;
END;
END Terminal.